# 正则练习题目

'-------1验证邮箱--------------'
#规则：
# - 用户名部分允许字母数字、点、下划线、百分号、加号和减号
# - 域名部分允许字母数字、点和减号
# - 必须有且只有一个@符号
# - 顶级域名（如com/cn）长度2-6个字母

# **示例**：
# - 有效：`user.name+123@example.com.cn`
# - 无效：`@example.com` `user@.com` `user@domain.a`

cmd1 = r'[a-zA-Z0-9._%+-]+@{1}[a-zA-Z0-9.-]+\.[a-zA-z]{2,6}'



'------------2匹配日期-----------'
# 匹配`YYYY-MM-DD`格式的日期，要求：
# - 年份0000-9999
# - 月份01-12
# - 日期01-31（不需要验证月份具体天数）

# **示例**：
# - 有效：`2023-08-05` `1999-12-31`
# - 无效：`2023/08/05` `13-01-01` `2023-00-15`

# 这里说明（）不仅可以分组，还可以区分优先级
cmd2_1 = r'[0-9]{4}-0[1-9]|1[0-2]' # 这样写的话 是这样匹配的  [0-9]{4}-0[1-9]  和 1[0-2] 这两个2选一
cmd2_2 = r'[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])'

'------------3提取html中的链接--------------'
# 从HTML代码中提取所有`<a>`标签的href属性值，考虑：
# - 属性值可能有双引号或单引号包裹
# - 属性值前后可能有空格
# - 需要非贪婪匹配

# **示例输入**：
# ```html
# <a href="https://example.com">Link1</a>
# <a class='btn' href = '/about.html' >Link2</a>
# ```

# **期望输出**：
# `['https://example.com', '/about.html']`

cmd3_1= r'''<a.*href\s*['"](.*)['"].*a>'''
cmd3_2= r'''  <a.*href\s*=\s*['"](.*)['"].*?a>  '''




# https://blog.csdn.net/a34921324/article/details/127379809
'.(?=a)  匹配a前面的字符'
'.(?<!a) 匹配前面不是a的字符'
'.(?<=a) 匹配a后面的字符'
'.(?!a)  匹配后面不是a的字符'

'-------------4提取日志中的ip地址------------'
cmd = r'(([0-9a-fA-F]{4}:){7}[0-9a-f]{4})|(?:[0-9]{1,3}\.){3}[0-9]{1,3}'

pattern = r'''
    (?:\b(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b|  # IPv4 这个才是正确的
        (?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}  # IPv6
    )
'''

'-------------5解析apache访问日志------------'
'''
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
'''
cmd  = r'((?:\b(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b).*? (\[\d\d/[a-zA-Z]{3}/[0-9]{4}:]  )'

pattern = r'''
    ^(\S+)\s+          # IP
    \S+\s+             # 标识符 \s表示空白字符 tnfrv
    (\S+)\s+           # 用户名
    \[([^\]]+)\]\s+    # 时间  注意 [ ]这两个在正则表达式中要表示原来的意思要 ‘\[’ 这么写
    "(\w+)\s+          # 方法
    ([^ ]+)\s+         # 路径
    HTTP/\d\.\d"\s+    # 协议
    (\d{3})\s+         # 状态码
    (\d+)              # 响应大小
'''
'-------------6提取带时区的时间戳------------'
'2023-08-10T14:23:45+08:00  或者 2023-12-25T08:30:00Z' 

cmd = r'[0-9]{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[Z(?:+\d{2}:\d{2})]'
'这样子有错误，[Z(?:+\d{2}:\d{2})]  [ ]会匹配里面的所有字符，里面的字符连起来不表示任何意思[(?:)]表示分别匹配？：（ ）这些符号'
cmd = r'[0-9]{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]+\d{2}:\d{2})'